#include "BaseUI.h"

#include <QtGui/QApplication>

#include <QtGui/QVBoxLayout>
#include <QtGui/QHBoxLayout>
#include <QtGui/QPushButton>

using namespace std;

DebugLevelType BaseUI::interne( BLANK );

/**
 * Constructeur par défaut. Ici on détermine le nom du Widget, quel
 * est son éventuel parent et on initialise les différentes structures
 * internes.
 *
 * @param[in] nom permet d'identifier le widget.
 * @param[in] parent pointeur sur le widget parent (orphelin par défaut).
 */
BaseUI::BaseUI( const QString& nom, QWidget *parent )
  : QWidget( parent ), ADDObjetBase( nom.toStdString() ), OK( true )
{
  setObjectName( nom );

  fenetreLayout = new QVBoxLayout( this );
  fenetreLayout -> setObjectName( QString::fromUtf8("Layout de la fenêtre") );
  boutonsLayout = new QHBoxLayout( fenetreLayout -> widget() );
  boutonsLayout -> setObjectName( QString::fromUtf8("Layout des boutons") );
}

/**
 * Constructeur de copie. Le seul élément à copier ici est le nom du
 * widget.
 *
 * @param[in] baseUI instance de BaseUI à dupliquer.
 */
BaseUI::BaseUI( const BaseUI& baseUI )
  : QWidget( static_cast< QWidget* >( baseUI.parent() ) ),
    ADDObjetBase( baseUI.objectName().toStdString() ), OK( true )
{
  setObjectName( baseUI.objectName() );

  fenetreLayout = new QVBoxLayout( this );
  fenetreLayout -> setObjectName( QString::fromUtf8("Layout de la fenêtre") );
  boutonsLayout = new QHBoxLayout( fenetreLayout -> widget() );
  boutonsLayout -> setObjectName( QString::fromUtf8("Layout des boutons") );
}

/**
 * Destructeur, ne fait rien de spécial. La gestion de la mémoire
 * est laissée au mécanisme natif de Qt.
 *
 * Le destructeur est déclaré virtual, afin d'assurer une destruction
 * correcte des différents objets.
 */
BaseUI::~BaseUI()
{}

/**
 * Permet de fixer la valeur de BaseUI::interne.
 *
 * @param[in] Level nouvelle valeur pour BaseUI::interne.
 */
void BaseUI::setLevel( const DebugLevelType& Level, const unsigned& )
{
  interne = Level;
}

/**
 * Insère les boutons contenus dans le conteneur boutons dans le
 * layout boutonsLayout. Ne doit pas être appelé directement, sinon
 * les boutons peuvent être mal placés!
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC affiche les messages de début et de fin de méthode.
 */
void BaseUI::setBoutonsLayout()
{
  /*Debug::*/empileNiveau( &interne );
  func() << "BaseUI::setBoutonsLayout -> début" << endmsg;
  
  unsigned int i, taille(boutons.size());

  for (i = 0; i < taille; i++)
    boutonsLayout -> addWidget(boutons[i]);

  fenetreLayout -> insertLayout(-1, boutonsLayout);

  func() << "BaseUI::setBoutonsLayout -> fin" << endmsg;
  /*Debug::*/depileNiveau();
}

/**
 * Ajoute la barre des boutons, en faisant appel à setBoutonsLayout(),
 * puis assigne le layout fenetreLayout au widget courant.
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC affiche les messages de début et de fin de méthode.
 */
void BaseUI::setFenetreLayout()
{
  /*Debug::*/empileNiveau( &interne );
  func() << "BaseUI::setFenetreLayout -> début" << endmsg;

  setBoutonsLayout();

  this -> setLayout( fenetreLayout );

  func() << "BaseUI::setFenetreLayout -> fin" << endmsg;
  /*Debug::*/depileNiveau();
}


/**
 * Est connecté au bouton "OK", approuve le choix fait. Le booléen OK
 * est mis à \e true, et on appelle le slot close().
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC affiche le message "Fermer et accepter".
 */
void BaseUI::fermer()
{
  OK = true;

  /*Debug::*/empileNiveau( &interne );
  func() << "Fermer et accepter" << endmsg;
  /*Debug::*/depileNiveau();

  close();
}

/**
 * Est connecté au bouton "Annuler" et annule le choix fait. Le booléen OK
 * est mis à \e false, et on appelle le slot close().
 *
 * Le niveau de sortie est paramétré par BaseUI::interne :\n
 * - \e FUNC affiche le message "Fermer et annuler".
 */
void BaseUI::annuler()
{
  OK = false;
  /*Debug::*/empileNiveau( &interne );
  func() << "Fermer et annuler" << endmsg;
  /*Debug::*/depileNiveau();

  close();
}
